package com.lch.base.http.callback;

import com.lch.base.http.HttpConfig;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import okhttp3.ResponseBody;
import retrofit2.Response;

/**
 * callback基础类
 * 如果需要重写callback需要继承这个类
 *
 * @author lee(29487113@qq.com) on 18/2/4
 */
public abstract class RxBaseCallBack<T> extends ICallbackBase<T, Response<ResponseBody>> {


    public RxBaseCallBack() {
        super();
    }

    public RxBaseCallBack(Object tag) {
        super(tag);
    }


    @Override
    public Type getTransType() {
        /**
         * getClass().getGenericSuperclass() 返回表示此 Class 所表示的实体（类、接口、基本类型或 void）的直接超类的 Type，然后将其转换ParameterizedType。
         getActualTypeArguments() 返回表示此类型实际类型参数的 Type 对象的数组。[0]就是这个数组中第一个了。简而言之就是获得超类的泛型参数的实际类型。
         */
        //获取第一个泛型的类型，解析类型
        //http://blog.csdn.net/qq_18242391/article/details/54251947
        //http://www.cnblogs.com/onlysun/p/4539472.html
        Type type = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

        return type;
    }

    @Override
    public T onHandleResponse(Response<ResponseBody> response) throws Exception {
        if (isHttpReponseOk(response)) {
            return transform(response, getTransType());
        }
        return null;
    }


    @Override
    public boolean isHttpReponseOk(Response<ResponseBody> response) {
        return response != null && response.isSuccessful();
    }

    //http://blog.csdn.net/cuiyufeng2/article/details/73732309 其实可以走CustomConverterFactory  待处理
    @Override
    public <T> T transform(Response<ResponseBody> response, Type type) throws Exception {
        return HttpConfig.getTransformer().transformer(response, type); //调用解析器，外部可以设置，可以使用gson或者其他
    }
}
